/**
 *@file sfx.c
 *@brief Arquivo que contém o módulo sonoro do Jonathas
 */

/**
 *@addtogroup sfx
 *@{
 */

static Mix_Music * musica_menu = NULL;
static Mix_Music * musica_tela = NULL;
static Mix_Music * musica_jogo = NULL;

/**
 *@brief como o nome ja diz, essa funcao pausa a musica
 * que esta em execursao.
 *@details a musica so pode realmete ser pausada se ela 
 * estiver tocando ativamente 
 */
void pausa_musica(){
/**
 *@{
 */
	Mix_PauseMusic();
/**
 *@}
 */
}

/**
 *@brief essa funcao "despausa" a musica que foi pausada
 */
void retoma_musica(){
/**
 *@{
 */
	Mix_ResumeMusic();
/**
 *@}
 */
}


/**
 *@brief carrega as musicas para memoria
 *@details essa funcao nao recebe nenhum parametro.  
*/
void sfx_init(){
/**
 *@{
 */
	musica_jogo = Mix_LoadMUS("./sfx/jogo.ogg");		
	musica_menu = Mix_LoadMUS("./sfx/menu.ogg");
	musica_tela = Mix_LoadMUS("./sfx/tela.ogg");
/**
 *@}
 */
}

/**
 *@brief desaloca as musicas da memoria
 *@details essa funcao nao recebe nenhum parametro
*/
void sfx_quit()
{
/**
 *@{
 */
	Mix_FreeMusic(musica_jogo);
	musica_jogo = NULL;
	Mix_FreeMusic(musica_menu);
	musica_menu = NULL;
	Mix_FreeMusic(musica_tela);
	musica_jogo = NULL;
/**
 *@}
 */
}

/**
 *@brief desaloca apenas uma musica carregada
 *@details A função "free_music" irá receber como 
 * parametro um nome de macro,um "DEFINE", e após 
 * verificar o caso,irá liberar a música alocada na 
 * memória.
 */
void free_music(int num){
/**
 *@{
 */
	switch(num){
		case SOM_JOGO: Mix_FreeMusic(musica_jogo);
			musica_jogo = NULL;
			break;
		case SOM_MENU: Mix_FreeMusic(musica_menu);
			musica_menu = NULL;
			break;
		case SOM_TELA: Mix_FreeMusic(musica_tela);
			musica_menu = NULL;
    }
/**
 *@}
 */
}

/**
 *@brief toca um som
 *@details essa funcao configura a saida de som, chamando
 * a funcao Mix_openAudio,da biblioteca SDL_mixer,ela 
 * emitirá uma onda sonora de 44.1Khz, operará com 16 Bits,
 * em 2 canais(stereo)e terá um buffer de 4kb).  
 * Ira receber como parametro um nome de macro, um "DEFINE",
 * e apos uma verificacao de qual case sera executado uma
 * musica sera tocada
 */
void play_sound(int num){
/**
 *@{
 */
	if(Mix_OpenAudio(44100,MIX_DEFAULT_FORMAT,2,4096) == -1){
		printf("erro ao configurar mixer\n");
	}
	switch(num){
		case SOM_JOGO:
			if(!musica_jogo){
				printf("Ocorreu erro : %s\n",Mix_GetError());
			}else{
				Mix_PlayMusic(musica_jogo,-1);
			}
			break;
		case SOM_MENU:
			if(!musica_menu){
				printf("Ocorreu erro : %s\n",Mix_GetError());
			}else{
				Mix_PlayMusic(musica_menu,-1);
			}
			break;
		case SOM_TELA:
			if(!musica_tela){
				printf("Ocorreu erro : %s\n",Mix_GetError());
			}else{
				Mix_PlayMusic(musica_tela,-1);
			}
			break;
		default:
			printf("Parâmetro incorreto, por favor verificar os defines\n");
	}
/**
 *@}
 */
}

/**
 *@}
 */
